// 从 NestJS 公共模块导入 Injectable 装饰器和 NotFoundException 异常类
import { Injectable, NotFoundException } from '@nestjs/common';
// 从 NestJS TypeORM 模块导入 InjectRepository 装饰器，用于注入仓库
import { InjectRepository } from '@nestjs/typeorm';
// 从 TypeORM 库导入 Repository 类型，用于定义仓库
import { Repository } from 'typeorm';
// 导入用户实体类
import { User } from './entities/user.entity';
// 导入创建用户数据传输对象
import { CreateUserDto } from './dto/create-user.dto';

/**
 * 用户服务类，提供与用户相关的业务逻辑
 */
@Injectable()
export class UsersService {
  /**
   * 构造函数，注入用户仓库
   * @param usersRepository - 用户实体的仓库实例
   */
  constructor(
    // 注入 User 实体的仓库
    @InjectRepository(User)
    private usersRepository: Repository<User>,
  ) {}

  /**
   * 查询所有用户
   * @returns 返回所有用户的数组
   */
  findAll() {
    // 调用仓库的 find 方法查询所有用户
    return this.usersRepository.find();
  }

  /**
   * 根据 ID 查询单个用户
   * @param id - 用户的 ID
   * @returns 返回查询到的用户
   * @throws {NotFoundException} 当用户不存在时抛出异常
   */
  async findOne(id: number) {
    // 根据 ID 查询用户
    const user = await this.usersRepository.findOne({ where: { id } });
    // 如果用户不存在，抛出异常
    if (!user) {
      throw new NotFoundException(`User with ID ${id} not found`);
    }
    return user;
  }

  /**
   * 创建新用户
   * @param createUserDto - 创建用户的数据传输对象
   * @returns 返回创建成功的用户
   */
  create(createUserDto: CreateUserDto) {
    // 根据 DTO 创建用户实体实例
    const user = this.usersRepository.create(createUserDto);
    // 保存用户实体到数据库
    return this.usersRepository.save(user);
  }
}